<?php
abstract class Model extends Mysql
{
	/**
     +----------------------------------------------------------
     * 创建数据库连接
     +----------------------------------------------------------
     * @return object
     +----------------------------------------------------------
     */
    public function __construct(){
    	
    	// 建立数据库连接
    	$this->_connect();
    }
    
	/**
     +----------------------------------------------------------
     * 利用__call方法实现一些特殊的Model方法 （魔术方法）
     +----------------------------------------------------------
     * @access public
     +----------------------------------------------------------
     * @param string $method 方法名称
     * @param array $args 调用参数
     +----------------------------------------------------------
     * @return mixed
     +----------------------------------------------------------
     */
    public function __call($method,$args) {
    	// 判断魔术方法的方法名
    	switch (strtoupper($method)){
    		case "SQL":
    			if(count($args)>=1){
					$param1 = $args[0];
					$param2 = (isset($args[1]) && is_array($args[1]))?$args[1]:array();
					
					if(is_string($param1) && trim($param1) != ""){
	    				return $this->SqlCat($param1,$param2);
					}else{
						IException::set("调用SQL函数的参数值不正确！",__FILE__,__LINE__);
					}
    			}else{
    				IException::set("调用SQL函数的参数个数不正确！",__FILE__,__LINE__);
    			}
    			break;
    		case "FILE":
    			
    			if(count($args)>=1){
					$param1 = $args[0];
					$param2 = (isset($args[1]) && is_array($args[1]))?$args[1]:array();
					
					if(is_string($param1) && trim($param1) != ""){
	    				return $this->FileCat($param1,$param2);
					}else{
						IException::set("调用file函数的参数值不正确！",__FILE__,__LINE__);
					}
    			}else{
    				IException::set("调用file函数的参数个数不正确！",__FILE__,__LINE__);
    			}
    			break;
    		case "S":
    			
    			$this->S($args);
    			break;
    		case "I":
    			
    			$this->I($args);
    			break;
    		case "U":
    			
    			$this->U($args); 
    			break;
    		case "D":
    			
    			$this->D($args);
    			break;
    		case "E":
    			
    			$this->E($args);
    			break;
    	}
    }
    
    /**
     +----------------------------------------------------------
     * 拼写SQL文（字符串）
     +----------------------------------------------------------
     * @access public
     +----------------------------------------------------------
     * @param array $options 表达式参数
     +----------------------------------------------------------
     * @return mixed
     +----------------------------------------------------------
     */
    public function SqlCat($sql,$param) {
    	// 输出日志
    	if(LOG_STATUS) Log::record('');
    	if(LOG_STATUS) Log::record('=====================数据库操作====================');

    	// 替换sql参数
        foreach ($param as $key=>$value){
        	$sql = str_replace('['.$key.']',$value,$sql);
        }
        
        // 保存sql问
        if(LOG_STATUS) Log::record('数据库操作SQL文：'.$sql);
        $this->_SQL = $sql;

        return $this;
    }
    
    /**
     +----------------------------------------------------------
     * 拼写SQL文（文件）
     +----------------------------------------------------------
     * @access public
     +----------------------------------------------------------
     * @param array $options 表达式参数
     +----------------------------------------------------------
     * @return mixed
     +----------------------------------------------------------
     */
    public function FileCat($filename,$param) {
    	// 输出日志
    	if(LOG_STATUS) Log::record('');
    	if(LOG_STATUS) Log::record('=====================数据库操作====================');

    	// 读取sql文件路径
    	$file_path = MODEL_PATH.'SQLFile/'.$filename.'.sql';
    	if(LOG_STATUS) Log::record('SQLFile路径：'.$file_path);
    	
    	// 判断文件是否存在并且读取
    	if(file_exists($file_path)){
    		$sql  = FileTool::read($file_path);

    		// 替换sql参数
	        foreach ($param as $key=>$value){
	        	$sql = str_replace('['.$key.']',$value,$sql);
	        }
    	}else{
    		IException::set("SQL文件".$file_path."，不存在！",__FILE__,__LINE__);
    	}
    	
        if(LOG_STATUS) Log::record('数据库操作SQL文：'.$sql);
        $this->_SQL = $sql;

        return $this;
    }

	/**
     +----------------------------------------------------------
     * 执行SELECT操作
     +----------------------------------------------------------
     * @access public
     +----------------------------------------------------------
     * @param string $row 表达式
     +----------------------------------------------------------
     * @return mixed
     +----------------------------------------------------------
     */
    public function S($row="all") {
    	// 输出日志
    	if(LOG_STATUS) Log::record('');

    	// 执行sql文
    	$this->query($this->_SQL);
    			
    	if (!$this->error()){
    		
    		// 取得全部记录
    		if($row == "all"){
    			return $this->fetchAll();
    		
    		// 取得第一条记录
    		}elseif(is_int($row) && $row==1){
    			return $this->fetch();
    			
    		// 取得指定行的记录
    		}else{
    			$rs = $this->fetchAll();
    			if(is_int($row) && ($row < count($rs))){
    				return $rs[$row];
    			}else{
    				return false;
    			}
    		}
		}else{
			IException::set('执行SQL文存在错误：'.$this->error(), __FILE__, __LINE__);
		}
    }
    
	/**
     +----------------------------------------------------------
     * 执行INSERT操作
     +----------------------------------------------------------
     * @access public
     +----------------------------------------------------------
     * @return int
     +----------------------------------------------------------
     */
    public function I() {
    	// 输出日志
    	if(LOG_STATUS) Log::record('');
    	
    	// 执行sql文
    	$this->query($this->_SQL);
    			
    	if (!$this->error()){
    		
    		// 取得insert记录的id
    		return $this->lastInsertId();
		}else{
			IException::set('执行SQL文存在错误：'.$this->error(), __FILE__, __LINE__);
		}
    }
    
	/**
     +----------------------------------------------------------
     * 执行UPDATE操作
     +----------------------------------------------------------
     * @access public
     +----------------------------------------------------------
     * @return int
     +----------------------------------------------------------
     */
    public function U() {
    	// 输出日志
    	if(LOG_STATUS) Log::record('');
    	
    	// 执行sql文
    	$this->query($this->_SQL);
		
    	if (!$this->error()){
    		
    		// 取得sql影响的记录数
    		return $this->affectedRows();
		}else{
			IException::set('执行SQL文存在错误：'.$this->error(), __FILE__, __LINE__);
		}
    }
    
	/**
     +----------------------------------------------------------
     * 执行DELETE操作
     +----------------------------------------------------------
     * @access public
     +----------------------------------------------------------
     * @return int
     +----------------------------------------------------------
     */
    public function D() {
    	// 输出日志
    	if(LOG_STATUS) Log::record('');
    	
    	// 执行sql文
    	$this->query($this->_SQL);
		
    	if (!$this->error()){
    		
    		// 取得sql影响的记录数
    		return $this->affectedRows();
		}else{
			IException::set('执行SQL文存在错误：'.$this->error(), __FILE__, __LINE__);
		}
    }
    
	/**
     +----------------------------------------------------------
     * 执行exe操作
     +----------------------------------------------------------
     * @access public
     +----------------------------------------------------------
     * @return int
     +----------------------------------------------------------
     */
    public function E() {
    	// 输出日志
    	if(LOG_STATUS) Log::record('');
    	
    	// 执行sql文
    	$this->query($this->_SQL);
		
    	if (!$this->error()){
    		
    		// 取得sql影响的记录数
    		return $this->affectedRows();
		}else{
			IException::set('执行SQL文存在错误：'.$this->error(), __FILE__, __LINE__);
		}
    }
    
	public function __destruct()
    {
        // 关闭连接
        $this->close();
    }
}